/****************************************************************************
 * Copyright (C) 2009 SciTouch LLC
 * 
 * This file is part of Indigo toolkit.
 * 
 * This file may be distributed and/or modified under the terms of the
 * GNU General Public License version 3 as published by the Free Software
 * Foundation and appearing in the file LICENSE.GPL included in the
 * packaging of this file.
 * 
 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 ***************************************************************************/

#ifndef __molecule_tree_canonizer__
#define __molecule_tree_canonizer__

#include "graph/tree_canonizer.h"

class Molecule;

class MoleculeTreeCanonizer : public TreeCanonizer
{
public:
   MoleculeTreeCanonizer (const Molecule &mol);

   void edgeCodesOff ();

   void process (Output &output);
   
protected:

   struct _VertexLabel
   {
      int idx;
      int label;
   };

   static int _cmp_vlabels(const _VertexLabel &a, const _VertexLabel &b, const void *context);
   
   static int _vertex_rank (const Graph &tree, int vertex_idx, const void *context);
   static int _edge_rank (const Graph &tree, int edge_idx, const void *context);

   static void _vertex_code (const Graph &tree, int vertex_idx, Output &output);
   static void _edge_code (const Graph &tree, int edge_idx, Output &output);
   
   TL_CP_DECL(Array<int>, _vertex_ranks);
};

#endif
